package com.aust.dynamicProxy.test1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 工具类
 */
public class ProxyUtil {
    /**
     * 创建代理对象
     */
    public static Star createProxy(Star star) {
        /**
         * loader	    类加载器，通常是目标类的类加载器(必须指定类加载器，否则无法找到接口类)
         * interfaces	被代理类实现的接口列表
         * h	        代理逻辑处理器，必须实现 InvocationHandler 接口
         */
        Star starProxy = (Star) Proxy.newProxyInstance(
                /**
                 * 类加载器：用于指定用哪个类加载器，去加载生成的代理类
                 */
                Star.class.getClassLoader(),
                /**
                 * 类对象数组：指定接口，这些接口用于指定生成的代理长什么，也就是有哪些方法
                 */
                new Class[]{Star.class},
                /**
                 * 函数式接口：用来指定生成的代理对象要干什么事情
                 */
                new InvocationHandler() {
                    /**
                     * invoke()为回调方法
                     * proxy：代理对象
                     * method：执行方法
                     * args：方法参数
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        /**
                         * 代理对象要做的事情
                         */
                        if (method.getName().equals("sing")) {
                            System.out.println("唱歌准备");
                        } else if (method.getName().equals("dance")) {
                            System.out.println("跳舞准备");
                        }
                        return method.invoke(star, args);
                    }
                }
        );
        return starProxy;
    }
}
